package org.gridlab.gridsphere.services.visualization;

import java.util.Date;
import java.util.List;
import java.util.ArrayList;

/**
 * Domyślna implementacja interfejsu DataProvider
 * @author Krzysztof Goj
 */
public class DefaultDataProvider implements DataProvider {
    private Class dataType = Object.class;
    private Date creationTime = new Date();
    private List series = new ArrayList();
    private List seriesNames = new ArrayList();

    /**
     * Zwraca typ danych dostarczany przez ten DataProvider
     * @return Typ danych dostarczany przez ten DataProvider
     */
    public Class getDataType() {return dataType;}

    /**
     * Ustala typ danych dostarczany przez ten DataProvider
     * @param type Nowy typ danych dostarczany przez ten DataProvider
     */
    public void setDataType(Class type) {dataType = type;}

    /**
     * Zwraca liczbę serii danych
     * @return Liczba serii danych
     */
    public int getSeriesCount() {return series.size();}

    /**
     * Zwraca etykietę serii danych
     * @param seriesNo Numer serii danych
     * @return Etykieta serii danych
     */
    public String getSeriesName(int seriesNo) {
        return (String)seriesNames.get(seriesNo);
    }

    /**
     * Pobiera serię danych o danym numerze
     * @param seriesNo Numer serii danych
     * @return Seria danych
     */
    public Object getData(int seriesNo) {
        return series.get(seriesNo);
    }

    /**
     * Wprowadza nową serię danych do DataProvidera
     * @param seriesNo Numer serii danych
     * @param data Seria danych
     * @throws java.lang.IndexOutOfBoundsException Wyjątek generowany w przypadku odwołania się do numeru nieistniejącej serii danych
     * @throws java.lang.ClassCastException Wyjątek generowany w przypadku, gdy określona klasa nie zostanie odnaleziona
     */
    public void setData(int seriesNo, Object data) { 
        if(!dataType.isInstance(data))
            throw new ClassCastException(data.getClass().getName() + " isn't " + dataType.getName());
        series.set(seriesNo, data);
    }

    /**
     * Dodaje nową serię danych oraz domyślną nazwę serii
     * @param data Nowa seria danych
     * @throws java.lang.IndexOutOfBoundsException 
     * @throws java.lang.ClassCastException Wyjątek rzucany, gdy wprowadzane dane mają niewłaściwy typ
     */
    public void addSeries(Object data) throws IndexOutOfBoundsException, ClassCastException { 
        if(!dataType.isInstance(data))
            throw new ClassCastException(data.getClass().getName() + " isn't " + dataType.getName());
        series.add(data);
        seriesNames.add("series " + series.size());
    } 

    /**
     * Dodaje nową serię danych o określonej nazwie
     * @param data Seria danych
     * @param name Etykieta serii
     * @throws java.lang.IndexOutOfBoundsException 
     * @throws java.lang.ClassCastException 
     */
    public void addSeries(Object data, String name) throws IndexOutOfBoundsException, ClassCastException { 
        if(!dataType.isInstance(data))
            throw new ClassCastException(data.getClass().getName() + " isn't " + dataType.getName());
        series.add(data);
        seriesNames.add(name);
    } 

    /**
     * Ustala nazwę określonej serii danych
     * @param seriesNo Numer serii danych
     * @param name Etykieta serii danych
     * @throws java.lang.IndexOutOfBoundsException Wyjątek generowany w przypadku odwołania się do numeru nieistniejącej serii danych
     */
    public void setSeriesName(int seriesNo, String name) throws IndexOutOfBoundsException { 
        seriesNames.set(seriesNo, name);
    }

    /**
     * Zwraca czas utworzenia
     * @return Czas utworzenia
     */
    public Date getCreationTime() {
        return creationTime;
    }

    /**
     * Ustawia czas utworzenia
     */
    public void setCreationTime() {
        creationTime = new Date();
    }

    /**
     * Ustawia czas utworzenia
     * @param d Nowy czas utworzenia
     */
    public void setCreationTime(Date d) {
        creationTime = d;
    }

    /**
     * Usuwa obecne w DataProviderze dane
     */
    public void clear() {
        dataType = Object.class;
        creationTime = new Date();
        series = new ArrayList();
        seriesNames = new ArrayList();
    }
}

